import CipherBase from "./";
import test from "tape";
import { inherits as inherits$0 } from "util";
var inherits = { inherits: inherits$0 }.inherits;
test('basic version', function (t) {
    function Cipher() {
        CipherBase.call(this);
    }
    inherits(Cipher, CipherBase);
    Cipher.prototype._update = function (input) {
        t.ok(Buffer.isBuffer(input));
        return input;
    };
    Cipher.prototype._final = function () {
        // noop
    };
    var cipher = new Cipher();
    var utf8 = 'abc123abcd';
    var update = cipher.update(utf8, 'utf8', 'base64') + cipher.final('base64');
    var string = (Buffer.from(update, 'base64')).toString();
    t.equals(utf8, string);
    t.end();
});
test('hash mode', function (t) {
    function Cipher() {
        CipherBase.call(this, 'finalName');
        this._cache = [];
    }
    inherits(Cipher, CipherBase);
    Cipher.prototype._update = function (input) {
        t.ok(Buffer.isBuffer(input));
        this._cache.push(input);
    };
    Cipher.prototype._final = function () {
        return Buffer.concat(this._cache);
    };
    var cipher = new Cipher();
    var utf8 = 'abc123abcd';
    var update = cipher.update(utf8, 'utf8').finalName('base64');
    var string = (Buffer.from(update, 'base64')).toString();
    t.equals(utf8, string);
    t.end();
});
test('hash mode as stream', function (t) {
    function Cipher() {
        CipherBase.call(this, 'finalName');
        this._cache = [];
    }
    inherits(Cipher, CipherBase);
    Cipher.prototype._update = function (input) {
        t.ok(Buffer.isBuffer(input));
        this._cache.push(input);
    };
    Cipher.prototype._final = function () {
        return Buffer.concat(this._cache);
    };
    var cipher = new Cipher();
    cipher.on('error', function (e) {
        t.notOk(e);
    });
    var utf8 = 'abc123abcd';
    cipher.end(utf8, 'utf8');
    var update = cipher.read().toString('base64');
    var string = (Buffer.from(update, 'base64')).toString();
    t.equals(utf8, string);
    t.end();
});
test('encodings', function (t) {
    inherits(Cipher, CipherBase);
    function Cipher() {
        CipherBase.call(this);
    }
    Cipher.prototype._update = function (input) {
        return input;
    };
    Cipher.prototype._final = function () {
        // noop
    };
    t.test('mix and match encoding', function (t) {
        t.plan(2);
        var cipher = new Cipher();
        cipher.update('foo', 'utf8', 'utf8');
        t.throws(function () {
            cipher.update('foo', 'utf8', 'base64');
        });
        cipher = new Cipher();
        cipher.update('foo', 'utf8', 'base64');
        t.doesNotThrow(function () {
            cipher.update('foo', 'utf8');
            cipher.final('base64');
        });
    });
    t.test('handle long uft8 plaintexts', function (t) {
        t.plan(1);
        var txt = 'ふっかつ　あきる　すぶり　はやい　つける　まゆげ　たんさん　みんぞく　ねほりはほり　せまい　たいまつばな　ひはん';
        var cipher = new Cipher();
        var decipher = new Cipher();
        var enc = decipher.update(cipher.update(txt, 'utf8', 'base64'), 'base64', 'utf8');
        enc += decipher.update(cipher.final('base64'), 'base64', 'utf8');
        enc += decipher.final('utf8');
        t.equals(txt, enc);
    });
});
